/**
 * @param {string} s
 * @param {number} numRows
 * @return {string}
 */
// 官方思路，每次数据向下和右上的值共2 * (numRows - 1)，算一个循环
// 所以每次按照这个循环取值
function convert(s, numRows) {
    const sLength = s.length
    if (numRows === 1 || sLength <= numRows) return s
    let res = ''
    const t = 2 * (numRows - 1)
    // 循环每一行
    for (let i = 0; i < numRows; i++) {
        // 每一循环的字符间隔，第一行和最后一行不取
        for (let j = i; j < sLength; j += t) {
            res += s[j];
            // 每一循环的第二个值
            if (i > 0 && i < numRows - 1 && (j + 2 * (numRows - i - 1)) < sLength) {
                res += s[(j + 2 * (numRows - i - 1))]
            }
        }
    }
    return res
};




/**
 * @param {string} s
 * @param {number} numRows
 * @return {string}
 */
// 我的做法，稍微复杂一点，思路是每一行取全部，逐行取。第一行和最后一行每两个字符相隔和maxgap=2*(numRows-1)
// 其他行每两个字符2*(numRows-1)和maxgap-2*(numRows-1)循环取值
// 通过一个指针判断取到第几位了
var convert = function (s, numRows) {
  if (numRows === 1) return s;

  const maxgap = 2 * (numRows - 1);
  let res = "",
    gap = 1,
    n = 1,
    cur = 0,
    point = 0;

  for (let i = numRows; i > 0; i--) {
    // 每一行的gap计算
    gap = i === 1 ? maxgap : 2 * (i - 1);
    res = res + s.charAt(cur);
    point = cur;

    while (point <= s.length) {
      // 每一行依次gap和maxgap-gap循环取值
      point = n % 2 === 1 ? point + gap : point + maxgap - gap;
      if (s.charAt(point) !== "") {
        res = res + s.charAt(point);
      }
      n++;
      // 第一行和最后一行每一个V只有一个值，偶数次maxgap-gap为0，跳过
      if (i === numRows || i === 1) {
        n++;
      }
    }
    n = 1;
    cur++;
  }
  return res;
};
